# 3. docker之镜像

# 镜像概念

# 镜像是什么 - 一个准备好的系统镜像

  1. 一个分层存储的文件

    docker history nginx
    ##用于查看镜像的分层信息
    
  2. 一个软件的环境

  3. 一个镜像可以创建N个容器(一个镜像可以创建多个容器,镜像可复用使用)

  4. 一种标准化的交付

  5. 一个不包含Linux内核而精简的linux操作系统

  6. 镜像不是一个单一的文件,而是有多层构成,可以通过docker hostory 镜像名,查看镜像中各层内容及大小,每层都对应着dockerfile中的一条指令

  7. 镜像也是容器的基石,容器是镜像的运行实例,有了镜像才能启动容器

  8. 每一个镜像都会有dockerfile文件,定义了如何构建docker镜像

  9. base镜像----提供了一个基本的操作系统环境,用户可以根据需要安装和配置软件

  10. base镜像通常是各种Linux发行版的Docker镜像比如ubuntu、Debian、centos等。

  11. base镜像只是在用户空间与发行版一致,kernel版本与发行版是不同的。比如说虚机系统是ubuntu14.04,运行一个容器是centos系统的,那么centos使用的其实就是本虚机的kernel。 容器只能使用本地虚机的kernel且不能修改。

  12. 镜像的分层结构:DockerHub中绝大多数的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。

  13. base镜像是from scratch开始,新镜像是直接在base镜像上构建from centos...... 新镜像是从base镜像一层一层叠加生成的,每安装一个软件就等于在现有的镜像上增加一层。

  14. Docker镜像采用分层结构的好处就是共享资源。

  15. 可写的容器层:当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就叫容器层,容器层之下都叫镜像层。

  16. 只有容器层是可写的,容器层下面的所有镜像层都是只读的。对容器的任何改动都只会发生在容器层中。

  17. 这里,所有的镜像层联合一起组成一个统一的文件系统,用户在容器层看到的就是一个叠加之后的文件系统。

镜像层内部是有上下之分的:

  1. 添加文件:在容器中创建文件时,新文件被添加到容器层中。
  2. 读取文件:当在容器中读取某个文件时,Docker会从上往下依次在各镜像层中查找此文件,一旦找到打开并读入内存。
  3. 修改文件:在容器中修改已存在的文件时,Docker会从上往下依次在各个镜像层中查找此文件,一旦找到立即将其复制到容器层中,然后才修改。(copy-on-write特性)
  4. 删除文件:在容器中删除文件时,Docker会从上往下依次在镜像层中找,找到后,会在容器层记录下此删除操作。 copy-on-write特性说明容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。所以镜像可以被多个容器共享。

docker镜像默认存储在/var/lib/docker/overlay2/

# 镜像与容器的联系

容器是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里面要写的文件复制到容器的读写层上,也是就容器自身的文件系统中

如果容器删除了,最上面的读写层也就删除了,改动的也就丢失了,所以无论多少容器共享一个镜像,对容器所做的所有操作都是从镜像中的文件系统复制到容器的读写层上操作的,并不会修改镜像的源文件,这种方式也是反向着提高磁盘利用率

若想持久化这些改动,可以通过docker命令 (docker commit) 将容器保存成一个全新的镜像

一个镜像创建多少容器,镜像增量式存储,创建的容器里面修改不会影响到镜像

容器的可写层存储路径:/var/lib/docker/containers/镜像的ID

GxhpM4.png

# 镜像常用命令

# 查看镜像 - ls

docker image ls 镜像名
选项:-a
	docker image ls 镜像名 -a
    ##查看所有镜像

# 查看镜像分层-(查看镜像历史) - history

docker image history 镜像名/镜像ID

# 查看镜像的详细信息 - inspect

docker image inspect 镜像名/镜像ID

# 向docker仓库拉取镜像 - pull

docker image pull 镜像名

# 推送镜像到镜像仓库 - push

docker image push 镜像名

# 删除一个镜像 - rm

docker image rm 镜像ID
选项:-f
	docker image rm -f 镜像ID
	## -f选项强制删除

# 清除悬空镜像(悬空镜像就是没有标签名也没容器引用的镜像)- prune

docker image prune 镜像名
选项:-a
	docker image prune 镜像名 -a
	## -a 选项删除没有引用容器的镜像

# 创建一个引用源镜像标记目标镜像 - tag

docker image tag 

# 导出容器文件系统到tar归档文件 - export

docker image export 

# 导入容器文件系统tar归档文件出创建镜像 - import

docker image import 

# 导出或保存一个或多个镜像到一个tar归档文件到当前目录 - save

docker image save 镜像名 > 导出的镜像文件名.tar

# 导入或加载镜像是来自tar归档或标准输出 - load

docker image load < 备份的镜像文件名.tar